﻿using System;
using System.Collections.Specialized;
using System.IO;
using System.Net;
using HtmlAgilityPack;

namespace WebClientTest
{
    class Program
    {
        static void Main(string[] args)
        {
            if (WebsiteStatus())
            {
                DownLoadImages();
            }

            SubmitFormular();
        }

        public static void SubmitFormular()
        {
            WebClient web = new WebClient();
            //Wenn es sich z.B. um eine Seite mit WindowsAuthentifizierung handelt im lokalen Netzwerk,
            //dann kann man hier die DefaultCredentials verwenden
            //web.Credentials = CredentialCache.DefaultCredentials;

            //Die POST Parameter erstellen die mit übergeben werden müssen, lassen sich z.B: sehr leicht per Firebug ermitteln
            NameValueCollection param = new NameValueCollection();
            param.Add("submit", "Anmelden");
            param.Add("send", "send");
            param.Add("sid", "");
            param.Add("l_username", "yourUserName");
            param.Add("l_password", "YourPassword");

            string url = "http://www.mycsharp.de/wbb2/login.php";
            byte[] responsebytes = web.UploadValues(url, "POST", param);
            //Der ResponseStream enthält die Webseite die nach dem Login aufgerufen bzw. angezeigt wird.
            string responsebody = System.Text.Encoding.Default.GetString(responsebytes);
            Console.Write(responsebody);
        }

        /// <summary>
        /// Prüfen ob der Status Code einer Webseite OK ist.
        /// </summary>
        public static bool WebsiteStatus()
        {
            //Prüfen ob mein Blog erreicht werden kann
            string url = "http://squadwuschel.wordpress.com/2012/08/09/ef5-model-first-datenbank-updates-vs-2012/";
            try
            {
                //Prüfen ob die Webseite erreicht werden kann.
                WebRequest request = WebRequest.Create(url);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    Console.WriteLine("STATUS - OK");
                    return true;
                }
                else
                {
                    Console.WriteLine("Aktueller Status '{0}'", response.StatusCode);
                }

            }
            catch (Exception exception)
            {
                Console.Write(exception);
            }

            return false;
        }

        /// <summary>
        /// Die Bilder einer Bestimmten URL Herunterladen und lokal speichern.
        /// </summary>
        public static void DownLoadImages()
        {
            //z.b. Alle Bilder von einem Meiner Blogeinträge herunterladen
            string url = "http://squadwuschel.wordpress.com/2012/08/09/ef5-model-first-datenbank-updates-vs-2012/";
            WebClient downloadHtml = new WebClient();
            //Erst das HTML Gerüst der Webseite herunterladen und in einen String Umwandeln
            byte[] htmlpage = downloadHtml.DownloadData(url);
            string content = System.Text.Encoding.Default.GetString(htmlpage);

            //Das HTML Agilit Pack verwenden um den HTML Code zu parsen
            //http://htmlagilitypack.codeplex.com/
            HtmlDocument document = new HtmlDocument();
            document.LoadHtml(content);

            //Mittels XPath Ausdruck alle Images auf der Seite heraussuchen
            foreach (HtmlNode img in document.DocumentNode.SelectNodes("//img/@src"))
            {
                //Den Pfad für das Bild ermitteln.
                string path = img.Attributes["src"].Value;
                Uri link = new Uri(path);
                try
                {
                    //Direkter Download der Datei
                    downloadHtml.DownloadFile(path, string.Format("c:\\Temp\\image-{0}.png", ++Counter));

                    //Damit Parallele Downloads möglich sind, muss jedes mal ein neues Weblcient Objekt erstellt werden.
                    //WebClient downloadFiles = new WebClient();
                    //downloadFiles.DownloadDataCompleted += DownloadFilesDownloadDataCompleted;
                    //downloadFiles.DownloadDataAsync(link);
                }
                catch (Exception exception)
                {
                    Console.WriteLine("Das Bild mit der Adresse '{0}' konnte nicht heruntergeladen werden.", link);
                }
            }


            Console.WriteLine("Download Fertig");
            Console.ReadLine();
        }

        public static int Counter = 0;
        /// <summary>
        /// Asynchrone Funktion zum Speichern der Bilder.
        /// </summary>
        static void DownloadFilesDownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
        {
            try
            {
                //Speichern des jeweiligen Bildes
                File.WriteAllBytes(string.Format("c:\\Temp\\image-{0}.png", ++Counter), e.Result);
                Console.WriteLine("Die Datei 'Image-{0}' wurde erfolgreich heruntergeladen.", Counter);
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
            }
        }
    }
}
